package cn.tedu.school.portal.service.impl;

import cn.tedu.school.portal.mapper.UserCourseMapper;
import cn.tedu.school.portal.model.User;
import cn.tedu.school.portal.mapper.UserMapper;
import cn.tedu.school.portal.model.UserCourse;
import cn.tedu.school.portal.service.IUserService;
import cn.tedu.school.portal.service.ex.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author tedu.cn
 * @since 2020-07-23
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    UserMapper userMapper;
    @Autowired
    UserCourseMapper userCourseMapper;

    @Override
    public void registerStudent(User user) {

        // 调用UserMapper对象的selectOne()方法，根据学号码查询学生账号信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("student_Id", user.getStudentId());
        User result = userMapper.selectOne(userQueryWrapper);
        // 判断查询结果是否不为null
        if (result != null) {
            //  是：找到了学生信息，表示学号码已经被占用，则不允许注册，抛出StudentIdDuplicateException
            throw new StudentIdDuplicateException("注册失败!学号被占用!");
        }
        // 调用UserMapper对象的insert()方法，根据参数user插入数据，获取返回值
        int rows = userMapper.insert(user);
        // 判断返回值（受影响的行数）是否不为1
        if (rows != 1) {
            // 是：受影响的行数不是1，则插入用户数据失败，抛出InsertException
            throw new InsertException("注册失败,服务器忙,请稍后再试");
        }
        //注册必修科目
        regMajorCourse(user.getId());

    }

    @Override
    public User login(String studentId, String password) {


        // 调用UserMapper对象的selectOne()方法，根据学号码查询学生账号信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("student_Id", studentId);
        User result = userMapper.selectOne(userQueryWrapper);
        //判断结果是否不存在
        if (result == null) {
            //  不存在：没有找到学生信息,账号名不存在
            throw new StudentDoNotExistException("登录失败,学号错误!");
        }
        //存在:判断查询结果中的密码与参数密码是否相等
        if (!password.equals(result.getPassword())) {
            //不相等,密码错误
            throw new PasswordNotMatchException("登录失败！密码错误！");
        }
        //账号和密码都没问题,调用login方法,得到完整的用户信息,返回用户对象
        User user = userMapper.login(studentId, password);

        return user;
    }

    @Override
    public Integer changePassword(Integer userId, String password) {
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("id", userId);
        User result = userMapper.selectOne(userQueryWrapper);
        //检查用户是否存在
        if(result==null){
            throw new StudentDoNotExistException("学生不存在,无法修改密码");
        }
        if(password.equals(result.getPassword())){
            throw new PasswordDuplicateException("新密码不能和原密码相同");
        }

        Integer rows = userMapper.changePassword(userId,password);
        if(rows!=1){
            throw new InsertException("修改失败,请稍后再试");
        }
        return rows;
    }


    /**
     * 在学生注册的时候就自动注册必修的课程
     * @param userId  注册成功学生的id
     * @return 插入条数
     */
    public void regMajorCourse(Integer userId){
        UserCourse userCourse = new UserCourse();
        for (int i = 1; i <=3 ; i++) {
            userCourseMapper.insert(userCourse.setUserId(userId).setCourseId(i));
        }
    }
}
